import os
import gradio as gr
from extract_subtitles import extract_subtitles

def process_video(file_path, output_format, language):
    """处理上传的视频/音频文件并返回字幕文件"""
    try:
        # 获取临时文件的实际路径
        temp_input = file_path.name
        
        # 生成输出文件名
        output_file = os.path.splitext(temp_input)[0] + f".{output_format}"
        
        # 调用原有的字幕提取函数
        extract_subtitles(temp_input, output_format, language)
        
        # 读取生成的字幕文件
        with open(output_file, "r", encoding="utf-8") as f:
            subtitle_content = f.read()
            
        # 清理临时文件
        if os.path.exists(output_file):
            os.remove(output_file)
            
        return subtitle_content
        
    except Exception as e:
        return f"处理过程中出现错误：{str(e)}"

# 创建 Gradio 界面
with gr.Blocks(title="视频字幕提取工具", theme=gr.themes.Soft()) as demo:
    gr.Markdown("""
    # 🎥 视频字幕提取工具
    
    上传视频或音频文件，自动提取字幕。支持的格式：
    - 视频：MP4, AVI, MKV, MOV
    - 音频：MP3, WAV, M4A, AAC
    """)
    
    with gr.Row():
        with gr.Column():
            file_input = gr.File(label="上传视频/音频文件")
            format_input = gr.Radio(
                choices=["srt", "txt"],
                value="srt",
                label="输出格式"
            )
            language_input = gr.Dropdown(
                choices=["auto", "zh", "en", "ja", "ko"],
                value="auto",
                label="音频语言",
                info="auto=自动检测"
            )
            submit_btn = gr.Button("开始提取字幕", variant="primary")
            
        with gr.Column():
            output_text = gr.Textbox(
                label="提取结果",
                placeholder="字幕将在这里显示...",
                lines=20
            )
    
    submit_btn.click(
        fn=process_video,
        inputs=[file_input, format_input, language_input],
        outputs=output_text
    )
    
    gr.Markdown("""
    ### 使用说明
    1. 上传视频或音频文件
    2. 选择输出格式（SRT 或纯文本）
    3. 选择音频语言（如果确定，可以指定具体语言）
    4. 点击"开始提取字幕"
    5. 等待处理完成，结果会显示在右侧文本框
    
    注意：首次使用时会下载 Whisper 模型，可能需要一些时间。
    """)

if __name__ == "__main__":
    demo.launch(
        server_name="0.0.0.0",  # 允许局域网访问
        server_port=7860,       # 指定端口号
        share=False,            # 不使用 Gradio 的公共链接
        inbrowser=True          # 自动打开浏览器
    )
